iTextSharp套件經常被使用來產出PDF檔案,
且新版iTextSharp套件有支援將HTML直接轉換成PDF,使用上相當方便直覺,
但若使用4.1.6以上的版本,會有授權相關問題,
如果要應用在商業行為中,就要特別注意這個部分,
為了當一個快樂的免費仔,我們使用4.1.6版手繪產出需要的PDF格式。
在開始之前,請先下載iTextSharp套件,並將其加入參考:
(以下使用visual studio的NuGet套件管理員操作)
//加入參考
using iTextSharp.text.pdf;
using iTextSharp.text;
這個範例先不考慮如何將動態值塞入PDF中,僅針對文字及表格繪製做處理。
首先先建立一個新的空白文件,並設定需要使用的文字字體:
//初始化
Document doc = new Document();
PdfWriter pdfWriter = PdfWriter.GetInstance(doc, stream);
//字型設定
string kaiu = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "KAIU.TTF");
string wingDing = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "WINGDNG2.TTF");
string sinhei = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "msjh.ttc,0");
BaseFont wingDings = BaseFont.CreateFont(wingDing, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Font wingdins2 = new Font(wingDings, 14);
BaseFont bfChinese = BaseFont.CreateFont(kaiu, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Font ChFont_Title = new Font(bfChinese, 24);
Font ChFont_Content = new Font(bfChinese, 12);
Font ChFont_Font18 = new Font(bfChinese, 18, 1);
Font ChFont_Font16 = new Font(bfChinese, 16);
Font ChFont_Font10 = new Font(bfChinese, 10);
Font ChFont_Font14_UnderLine = new Font(bfChinese, 14, Font.UNDERLINE);
BaseFont sinheiC = BaseFont.CreateFont(sinhei, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Font sinhei_Title = new Font(sinheiC, 18);
Font sinhei_Content = new Font(sinheiC, 12);
Font sinhei_Content_red = new Font(sinheiC, 12, Font.NORMAL, Color.RED);
接下來開始在對應位置放上需要的物件:
doc.Open();
PdfContentByte cb = pdfWriter.DirectContent;
//---畫左上角的框框----
cb.MoveTo(30, 820);
cb.LineTo(210, 820);
cb.MoveTo(210, 820);
cb.LineTo(210, 780);
cb.MoveTo(210, 780);
cb.LineTo(30, 780);
cb.MoveTo(30, 780);
cb.LineTo(30, 820);
cb.ClosePathStroke();
//---畫左上角的框框----
//第一個表格(放非表格的內容)
PdfPTable table = new PdfPTable(1);
table.TotalWidth = 500f;
table.LockedWidth = true;
Phrase doc_Id = new Phrase("申請單單號:" , ChFont_Content);
ColumnText.ShowTextAligned(cb, Element.ALIGN_CENTER, doc_Id, doc.Right / 2, doc.Top + 40, 0);//文字顯示於左上角
doc.Add(doc_Id);
PdfPCell header = new PdfPCell(new Phrase("測試申請單", ChFont_Title));
header.HorizontalAlignment = Element.ALIGN_CENTER;//文字置中
header.Border = PdfPCell.NO_BORDER; //不要有框線(因為是非表格的內容)
header.MinimumHeight = 20; //設定最小列高
table.AddCell(header); //把header的內容加到table中
//請辦事由
PdfPCell subject = new PdfPCell(new Phrase("主旨:測試申請單", ChFont_Font18));
subject.Border = PdfPCell.NO_BORDER;
subject.SetLeading(1.5f, 1.5f);
subject.MinimumHeight = 50;
table.AddCell(subject);
//回覆截止日
Paragraph paragraph1 = new Paragraph();
//"方框打勾"這個符號沒辦法直接輸出,所以用WINGDNG2字體的R代碼輸出
Chunk c1 = new Chunk("R", wingdins2);
Chunk c2 = new Chunk("請於 112 年 5 月 15 日下班前回覆", ChFont_Font14_UnderLine);
paragraph1.Add(c1);
paragraph1.Add(c2);
PdfPCell dueDate = new PdfPCell(paragraph1);
dueDate.Border = PdfPCell.NO_BORDER;
dueDate.MinimumHeight = 50;
table.AddCell(dueDate);
//申請人
PdfPCell applyName = new PdfPCell(new Phrase("申請人:王小明", ChFont_Font16));
applyName.Border = PdfPCell.NO_BORDER;
dueDate.SetLeading(3f, 1.5f);
table.AddCell(applyName);
//分機
PdfPCell txt = new PdfPCell(new Phrase("分機:111" , ChFont_Font16));
txt.Border = PdfPCell.NO_BORDER;
txt.MinimumHeight = 80;
table.AddCell(txt);
doc.Add(table);
//第二個表格(真的表格)
PdfPTable table2 = new PdfPTable(2);
table.TotalWidth = 500f;
table.LockedWidth = true;
PdfPCell header2 = new PdfPCell(new Phrase("測試表格", sinhei_Title));
header2.Colspan = 2; //標頭要橫跨2欄,所以Colspan設定為2
header2.HorizontalAlignment = Element.ALIGN_CENTER;
table2.AddCell(header2);
PdfPCell test1 = new PdfPCell(new Phrase("111", sinhei_Content));
test1.Colspan = 1;
table2.AddCell(test1);
PdfPCell content = new PdfPCell(new Phrase("內容內容", sinhei_Content));
content.Colspan = 1;
table2.AddCell(content);
PdfPCell test2 = new PdfPCell(new Phrase("2222", sinhei_Content));
test2.Colspan = 1;
table2.AddCell(test2);
PdfPCell content2 = new PdfPCell(new Phrase("內容內容內容", sinhei_Content_red));
content2.Colspan = 1;
table2.AddCell(content2);
doc.Add(table2);
doc.Close();
這樣就能夠繪製出範例內容了!
上方非表格的內容同樣放進表格中,是覺得表格比較容易控制內容排版,
若要使用文字段落呈現也沒有問題~